package com.itheima.d09_reflect_constructor;

import java.lang.reflect.Constructor;

/**
 * 目标：了解获取构造方法的方式
 */
public class Test {

    public static void main(String[] args) throws Exception {
        //1.获取Class对象
        Class<Cat> cls = Cat.class;

        //2.获取所有公共的构造方法
        Constructor<?>[] constructors = cls.getConstructors(); //获取所有公共的构造方法
        for (Constructor<?> constructor : constructors) {
            System.out.println( constructor);
        }
        System.out.println("========");

        //3.获取所有声明定义的构造方法
        Constructor<?>[] declaredConstructors = cls.getDeclaredConstructors(); //获取所有定义的方法构造方法
        for (Constructor<?> declaredConstructor : declaredConstructors) {
            System.out.println( declaredConstructor);
        }
        System.out.println("========");

        //4.获取指定的公共的构造方法
        Constructor<Cat> constructor = cls.getConstructor(String.class, int.class);
        System.out.println( constructor );
        System.out.println("========");

        //5.获取指定的构造方法
        Constructor<Cat> declaredConstructor = cls.getDeclaredConstructor();
        System.out.println( declaredConstructor);


        //6.创建小猫对象：设置name=小花猫,age=2
        Cat cat = new Cat("小花猫", 2);      //new 对象 = 高耦合
        System.out.println("正常方式创建小猫对象："+cat);


        //6.1 获取两个参数的构造方法（String ,int）
        Constructor constr = cls.getDeclaredConstructor(String.class, int.class);
        //6.2 私有的成员对象，设置暴力反射
        constr.setAccessible(true);
        //6.3 通过构造方法创建小猫对象
        Object cat1 = constr.newInstance("小花猫", 2);
        System.out.println("通过构造方法创建小猫对象："+cat1);

    }
}
